home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
oper_sys
/
emerald
/
emrldsys.lha
/
Language
/
Compiler
/
Builtins
/
InStream.m
< prev
next >
Wrap
Text File
|
1990-08-16
|
3KB
|
122 lines
%
% @(#)real_InStream.m 1.3 3/16/88
%
import _VectorOfCharObject from "Builtins"
export _InStreamObject to "Builtins"
const _InStreamObject == immutable object _InStreamObject
export getSignature, create
const InStreamType == type InStreamType
operation getChar -> [Character]
operation unGetChar [ Character ]
operation getString -> [ String ]
function eos -> [Boolean]
operation close
end InStreamType
function getSignature -> [ r : Signature ]
r <- InStreamType
end getSignature
operation create [ fd : Integer ] -> [r : InStreamType]
r <- object aUnixInStream
export getChar, unGetChar, getString, eos, close
const myfd : Integer == fd
monitor
var isBroken : Boolean <- false
const BUFSIZE == 1024
const buffer == _VectorOfCharObject.create[BUFSIZE]
var maxValidIndex : Integer <- ~1
var minValidIndex : Integer <- 0
var isClosed : Boolean <- myfd < 0
operation unGetChar [r : Character]
if minValidIndex > 0 then
minValidIndex <- minValidIndex - 1
buffer(minValidIndex) := r
elseif maxValidIndex < minValidIndex then
% the buffer is empty
minValidIndex <- 0
maxValidIndex <- 0
buffer(minValidIndex) := r
else
returnAndFail
end if
end unGetChar
operation getChar -> [r : Character]
if isClosed then returnAndFail end if
if maxValidIndex < minValidIndex then
% there is nothing in the buffer
if isBroken then
maxValidIndex <- ~1
else
primitive 016 [maxValidIndex] <- [myfd, buffer]
end if
minValidIndex <- 0
end if
if maxValidIndex < minValidIndex then
isClosed <- true
returnAndFail
else
r <- buffer(minValidIndex)
minValidIndex <- minValidIndex + 1
end if
end getChar
operation getString -> [r : String]
var c : Character
r <- ""
if isClosed then returnAndFail end if
loop
exit when isClosed
if maxValidIndex < minValidIndex then
% there is nothing in the buffer
if isBroken then
maxValidIndex <- ~1
else
primitive 016 [maxValidIndex] <- [myfd, buffer]
end if
minValidIndex <- 0
end if
if maxValidIndex < minValidIndex then
isClosed <- true
exit
else
c <- buffer(minValidIndex)
minValidIndex <- minValidIndex + 1
end if
r <- r || c.asString
exit when c = '\^J'
end loop
end getString
function eos -> [r : Boolean]
if isClosed then
r <- true
else
if maxValidIndex < minValidIndex then
% there is nothing in the buffer
if isBroken then
maxValidIndex <- ~1
else
primitive 016 [maxValidIndex] <- [myfd, buffer]
end if
minValidIndex <- 0
end if
isClosed <- maxValidIndex < minValidIndex
r <- isClosed
end if
end eos
operation close
isClosed <- true
maxValidIndex <- ~1
primitive 116 [] <- [myfd]
end close
end monitor
end aUnixInStream
end create
end _InStreamObject